home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / NET / IP.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  7KB  |  252 lines

  1. /*
  2.  * INET        An implementation of the TCP/IP protocol suite for the LINUX
  3.  *        operating system.  INET is implemented using the  BSD Socket
  4.  *        interface as the means of communication with the user level.
  5.  *
  6.  *        Definitions for the IP module.
  7.  *
  8.  * Version:    @(#)ip.h    1.0.2    05/07/93
  9.  *
  10.  * Authors:    Ross Biro, <bir7@leland.Stanford.Edu>
  11.  *        Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  12.  *        Alan Cox, <gw4pts@gw4pts.ampr.org>
  13.  *
  14.  * Changes:
  15.  *        Mike McLagan    :       Routing by source
  16.  *
  17.  *        This program is free software; you can redistribute it and/or
  18.  *        modify it under the terms of the GNU General Public License
  19.  *        as published by the Free Software Foundation; either version
  20.  *        2 of the License, or (at your option) any later version.
  21.  */
  22. #ifndef _IP_H
  23. #define _IP_H
  24.  
  25.  
  26. #include <linux/types.h>
  27. #include <linux/socket.h>
  28. #include <linux/ip.h>
  29. #include <linux/netdevice.h>
  30. #include <linux/inetdevice.h>
  31. #include <linux/in_route.h>
  32. #include <net/route.h>
  33. #include <net/arp.h>
  34.  
  35. #ifndef _SNMP_H
  36. #include <net/snmp.h>
  37. #endif
  38.  
  39. #include <net/sock.h>    /* struct sock */
  40.  
  41. struct inet_skb_parm
  42. {
  43.     struct ip_options    opt;        /* Compiled IP options        */
  44.     u16            redirport;    /* Redirect port        */
  45.     unsigned char        flags;
  46.  
  47. #define IPSKB_MASQUERADED    1
  48. #define IPSKB_TRANSLATED    2
  49. #define IPSKB_FORWARDED        4
  50. };
  51.  
  52. struct ipcm_cookie
  53. {
  54.     u32            addr;
  55.     int            oif;
  56.     struct ip_options    *opt;
  57. };
  58.  
  59. #define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb))
  60.  
  61. struct ip_ra_chain
  62. {
  63.     struct ip_ra_chain    *next;
  64.     struct sock        *sk;
  65.     void            (*destructor)(struct sock *);
  66. };
  67.  
  68. extern struct ip_ra_chain *ip_ra_chain;
  69.  
  70. /* IP flags. */
  71. #define IP_CE        0x8000        /* Flag: "Congestion"        */
  72. #define IP_DF        0x4000        /* Flag: "Don't Fragment"    */
  73. #define IP_MF        0x2000        /* Flag: "More Fragments"    */
  74. #define IP_OFFSET    0x1FFF        /* "Fragment Offset" part    */
  75.  
  76. #define IP_FRAG_TIME    (30 * HZ)        /* fragment lifetime    */
  77.  
  78. extern void        ip_mc_dropsocket(struct sock *);
  79. extern void        ip_mc_dropdevice(struct device *dev);
  80. extern int        ip_mc_procinfo(char *, char **, off_t, int, int);
  81.  
  82. /*
  83.  *    Functions provided by ip.c
  84.  */
  85.  
  86. extern int        ip_ioctl(struct sock *sk, int cmd, unsigned long arg);
  87. extern void        ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk,
  88.                           u32 saddr, u32 daddr,
  89.                           struct ip_options *opt);
  90. extern int        ip_rcv(struct sk_buff *skb, struct device *dev,
  91.                    struct packet_type *pt);
  92. extern int        ip_local_deliver(struct sk_buff *skb);
  93. extern int        ip_mr_input(struct sk_buff *skb);
  94. extern int        ip_output(struct sk_buff *skb);
  95. extern int        ip_mc_output(struct sk_buff *skb);
  96. extern void        ip_fragment(struct sk_buff *skb, int (*out)(struct sk_buff*));
  97. extern int        ip_do_nat(struct sk_buff *skb);
  98. extern void        ip_send_check(struct iphdr *ip);
  99. extern int        ip_id_count;              
  100. extern void        ip_queue_xmit(struct sk_buff *skb);
  101. extern void        ip_init(void);
  102. extern int        ip_build_xmit(struct sock *sk,
  103.                       int getfrag (const void *,
  104.                            char *,
  105.                            unsigned int,
  106.                            unsigned int),
  107.                       const void *frag,
  108.                       unsigned length,
  109.                       struct ipcm_cookie *ipc,
  110.                       struct rtable *rt,
  111.                       int flags);
  112.  
  113.  
  114. struct ip_reply_arg {
  115.     struct iovec iov[2];   
  116.     int          n_iov;    /* redundant */
  117.     u32          csum; 
  118.     int         csumoffset; /* u16 offset of csum in iov[0].iov_base */
  119.                  /* -1 if not needed */ 
  120. }; 
  121.  
  122. void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *arg,
  123.            unsigned int len); 
  124.  
  125. extern int __ip_finish_output(struct sk_buff *skb);
  126.  
  127. struct ipv4_config
  128. {
  129.     int    log_martians;
  130.     int    autoconfig;
  131.     int    no_pmtu_disc;
  132. };
  133.  
  134. extern struct ipv4_config ipv4_config;
  135. extern struct ip_mib    ip_statistics;
  136. extern struct linux_mib    net_statistics;
  137.  
  138. extern int sysctl_local_port_range[2];
  139.  
  140. extern __inline__ int ip_finish_output(struct sk_buff *skb)
  141. {
  142.     struct dst_entry *dst = skb->dst;
  143.     struct device *dev = dst->dev;
  144.     struct hh_cache *hh = dst->hh;
  145.  
  146.     skb->dev = dev;
  147.     skb->protocol = __constant_htons(ETH_P_IP);
  148.  
  149.     if (hh) {
  150.         read_lock_irq(&hh->hh_lock);
  151.         memcpy(skb->data - 16, hh->hh_data, 16);
  152.         read_unlock_irq(&hh->hh_lock);
  153.             skb_push(skb, dev->hard_header_len);
  154.         return hh->hh_output(skb);
  155.     } else if (dst->neighbour)
  156.         return dst->neighbour->output(skb);
  157.  
  158.     kfree_skb(skb);
  159.     return -EINVAL;
  160. }
  161.  
  162. extern __inline__ void ip_send(struct sk_buff *skb)
  163. {
  164.     if (skb->len > skb->dst->pmtu)
  165.         ip_fragment(skb, __ip_finish_output);
  166.     else
  167.         ip_finish_output(skb);
  168. }
  169.  
  170. extern __inline__
  171. int ip_decrease_ttl(struct iphdr *iph)
  172. {
  173.     u16 check = iph->check;
  174.     check = ntohs(check) + 0x0100;
  175.     if ((check & 0xFF00) == 0)
  176.         check++;        /* carry overflow */
  177.     iph->check = htons(check);
  178.     return --iph->ttl;
  179. }
  180.  
  181. extern __inline__
  182. int ip_dont_fragment(struct sock *sk, struct dst_entry *dst)
  183. {
  184.     return (sk->ip_pmtudisc == IP_PMTUDISC_DO ||
  185.         (sk->ip_pmtudisc == IP_PMTUDISC_WANT &&
  186.          !(dst->mxlock&(1<<RTAX_MTU))));
  187. }
  188.  
  189. /*
  190.  *    Map a multicast IP onto multicast MAC for type ethernet.
  191.  */
  192.  
  193. extern __inline__ void ip_eth_mc_map(u32 addr, char *buf)
  194. {
  195.     addr=ntohl(addr);
  196.     buf[0]=0x01;
  197.     buf[1]=0x00;
  198.     buf[2]=0x5e;
  199.     buf[5]=addr&0xFF;
  200.     addr>>=8;
  201.     buf[4]=addr&0xFF;
  202.     addr>>=8;
  203.     buf[3]=addr&0x7F;
  204. }
  205.  
  206.  
  207. extern int    ip_call_ra_chain(struct sk_buff *skb);
  208.  
  209. /*
  210.  *    Functions provided by ip_fragment.o
  211.  */
  212.  
  213. struct sk_buff *ip_defrag(struct sk_buff *skb);
  214.  
  215. /*
  216.  *    Functions provided by ip_forward.c
  217.  */
  218.  
  219. extern int ip_forward(struct sk_buff *skb);
  220. extern int ip_net_unreachable(struct sk_buff *skb);
  221.  
  222. /*
  223.  *    Functions provided by ip_options.c
  224.  */
  225.  
  226. extern void ip_options_build(struct sk_buff *skb, struct ip_options *opt, u32 daddr, struct rtable *rt, int is_frag);
  227. extern int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb);
  228. extern void ip_options_fragment(struct sk_buff *skb);
  229. extern int ip_options_compile(struct ip_options *opt, struct sk_buff *skb);
  230. extern int ip_options_get(struct ip_options **optp, unsigned char *data, int optlen, int user);
  231. extern void ip_options_undo(struct ip_options * opt);
  232. extern void ip_forward_options(struct sk_buff *skb);
  233. extern int ip_options_rcv_srr(struct sk_buff *skb);
  234.  
  235. /*
  236.  *    Functions provided by ip_sockglue.c
  237.  */
  238.  
  239. extern void    ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb);
  240. extern int    ip_cmsg_send(struct msghdr *msg, struct ipcm_cookie *ipc);
  241. extern int    ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int optlen);
  242. extern int    ip_getsockopt(struct sock *sk, int level, int optname, char *optval, int *optlen);
  243. extern int    ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct sock *));
  244.  
  245. extern int     ip_recv_error(struct sock *sk, struct msghdr *msg, int len);
  246. extern void    ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err, 
  247.                   u16 port, u32 info, u8 *payload);
  248. extern void    ip_local_error(struct sock *sk, int err, u32 daddr, u16 dport,
  249.                    u32 info);
  250.  
  251. #endif    /* _IP_H */
  252.